const { app, protocol, BrowserWindow, globalShortcut, ipcMain, desktopCapturer, webContents, Tray, Menu, session, dialog } = require('electron')
const { exec } = require('child_process');
const path = require('path')
// websocket类
const WebSocketManager = require("./lib/ScoketManager") 
// 数据库连接类
const SqliteManager = require("./lib/SqliteManager") 

app.allowRendererProcessReuse = true

// main.js  
const dataStorage = new Map()

app.commandLine.appendSwitch('--ignore-certificate-errors', 'true')
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])

let mainWindow = null,
  loginWindow = null,
  otherWindw = null,
  callWindow = null,
  recordsWindow = null,
  friendsWindow = null,
  db = new SqliteManager(),
  tray = null,
  canQuitNow = false
// Socket对象
let socketRenderer = null; // 渲染进程Socket对象 主要用来处理服务端返回的消息（新消息，好友请求，通话请求）
let socketMain = null; // 主进程Socket对象 用来处理扫码登录功能

// 创建登录窗口
const createLoginWindow = () => {
  console.log(`Current Chrome Version: ${process.versions.chrome}`)
  loginWindow = new BrowserWindow({
    customName: 'Login',
    title: '微信登录',
    width: 295,
    height: 380,
    center: true,
    frame: false,
    //窗口是否在创建时显示。 默认值为 true。
    show: false,
    transparent: false, // 启用透明窗口
    rounded: true, // 圆角
    webPreferences: {
      nodeIntegration: true, // 是否启用Node.js集成
      webSecurity: false,
      preload: path.join(__dirname, 'preload.js'),
      //session: customSes, //共享session
      partition: 'persist:share',
    },
  })
  loginWindow.setMenu(null)
  // 设置窗口是否可以由用户手动最大化。
  loginWindow.setMaximizable(false)
  // 设置用户是否可以调节窗口尺寸
  loginWindow.setResizable(false)
  loginWindow.setHasShadow(true)
  if (app.isPackaged) {
    loginWindow.loadURL(`file://${path.join(__dirname, '../../dist/login.html')}`)
    //loginWindow.loadURL(`https://www.baidu.com`)
  } else {
    loginWindow.loadURL('http://localhost:5173/login.html')
    //loginWindow.loadURL('http://127.0.0.1:5173/login.html')
    loginWindow.webContents.openDevTools()
  }
  loginWindow.once('ready-to-show', () => {
    loginWindow.show(); // 内容加载完毕后显示窗口
  });
  //loginWindow.unmaximize()
  ipcMain.handle('sent-login-event', async (event, params) => {
    // 登录成功
    if (params.type === 'login-success') {
      // 需要打开朋友圈窗口
      loginWindow.webContents.reload()
      loginWindow.hide()
      mainWindow.webContents.send('main-load-records', true);
      mainWindow.show() // 显示主窗口
      // 开启Socket
      socketRenderer = new WebSocketManager(`ws://localhost/websocket/message?token=${params.token}`); // 创建Socket对象
      // 创建主窗口时默认创建通话窗口和朋友圈窗口，提高渲染效率
      setTimeout(()=> {
        !callWindow && createCallWindow() // 创建视频通话窗口
        !otherWindw && createOtherWindow() //创建朋友圈创库
        !recordsWindow && createChatRecordsWindow() // 创建聊天记录窗口
        !friendsWindow && createFriendsRequestWindow(); // 创建好友请求窗口
      }, 200)
    }
  })
  loginWindow.on('close', (event) => {
    if(canQuitNow) {
      // 阻止窗口关闭  
      event.preventDefault();  
      loginWindow.hide()
    }  
  });
}

// 创建主窗口
const createMainWindow = () => {
    mainWindow = new BrowserWindow({
      title: '微信',
      width: 1453,
      height: 912,
      //窗口是否在屏幕居中. 默认值为 false
      center: true,
      frame: false,
      show: false,
      transparent: false, // 启用透明窗口
      rounded: true, // 圆角
      webPreferences: {
        nodeIntegration: true, // 是否启用Node.js集成
        webSecurity: false,
        preload: path.join(__dirname, 'preload.js'),
        //session: customSes, //共享session
        partition: 'persist:share',
      },
    })
    mainWindow.customName='Wechat',
    mainWindow.setMenu(null)
    // 设置用户是否可以调节窗口尺寸
    mainWindow.setResizable(true)
    // 根据打包模式判断是否打包
    if (app.isPackaged) {
      mainWindow.loadURL(`file://${path.join(__dirname, '../../dist/index.html')}`)
      //mainWindow.webContents.openDevTools({ detach: true })
    } else {
      mainWindow.loadURL('http://localhost:5173/#/home')
      //win.loadURL('http://localhost:5173/')
      // 安装 Vue Devtools
      //session.defaultSession.loadExtension(path.resolve(__dirname, '../../plugins/vue-devtools-chrome'))
      mainWindow.webContents.openDevTools({ detach: true })
      // 添加 Vue Devtools 插件
      // connect({
      //   host: 'localhost',
      //   port: 8098, // Vue Devtools 的默认端口
      // })
    }
    mainWindow.webContents.on('did-finish-load',() => {
      mainWindow.webContents.send('message-from-main', 'Hello from main process!');
    })
    // 注册快捷键
    globalShortcut.register('CommandOrControl+Shift+i', function () {
      mainWindow.webContents.openDevTools({ detach: true })
    })
    // 注册快捷键
    globalShortcut.register('CommandOrControl+Alt+c', function () {
      exec(path.join(__dirname, '..', '..', 'static', 'PrintScr.exe'))
    })
    // 主窗口监听事件
    ipcMain.handle('sent-main-event', async (event, params) => {
      // 关闭主窗口
      if (params.type === 'hide:main') {
        mainWindow.hide()
      }
      // 打开朋友圈窗口
      if (params.type === 'wechat-moments') {
        otherWindw.show()
      }
      // 打开好友请求的窗口
      if (params.type === 'friends-request') {
        friendsWindow.show()
        friendsWindow.webContents.send('main-request-friends', {requestId: params.requestId, requestMessage: params.requestMessage, remark: params.remark});
      }
      // 关闭好友请求的窗口
      if (params.type === 'friends-request-close') {
        friendsWindow.close()
      }
      // 发送聊天消息
      if (params.type === 'ev:send-chat-message') {
        socketRenderer.sendMessage(params.messageObj)
      }
      // 修改消息状态以及messageId
      if(params.type === 'ev:update-chat-message') {
        db.updateChatRecordStatus(params)
      }
      // 修改图片路径
      if(params.type === 'ev:update-chat-message-img') {
        db.updateChatRecordStatus(params)
      }
      // 查询最新消息
      if(params.type === 'query-chat-latest-records') {
        return db.queryChatTheLatestRecords(params)
      }
      // 修改未读数量
      if(params.type === 'update-chat-no-message') {
        return db.updateRoomsNoMessage(params)
      }
      // 打开通话窗口
      if (params.type === 'ev:voice-page') {
        try{
          callWindow.webContents.send('main-render-chat-call', {roomId: params.roomId, roomName: params.roomName, avatar: params.avatar, callType: params.callType});
          callWindow.show()
        }catch(err){
          createCallWindow()
          callWindow.webContents.send('main-render-chat-call', {roomId: params.roomId, roomName: params.roomName, avatar: params.avatar, callType: params.callType});
          callWindow.show()
        }
      } 
      // 打开聊天记录
      if (params.type === 'ev:records-page') {
        try{
          // 传递过去要显示的房间名称和姓名
          recordsWindow.webContents.send('main-render-chat-records', {roomName: params.roomName, roomId: params.roomId});
          recordsWindow.show()
        }catch(err){
          recordsWindow.show()
        }
      } 
      // 打开文件系统
      if (params.type === 'ev:open-file-dialog') {
        dialog.showOpenDialog(mainWindow, {
          properties: ['openFile'],
          filters: [
            { name: 'Images', extensions: ['jpg', 'png', 'gif'] },
            { name: 'All Files', extensions: ['*'] },
          ],
        }).then(result => {
          if (!result.canceled) {
            console.log(result.filePaths[0]);
          }
        }).catch(err => {
          console.log(err);
        });
      } 
      // 关闭聊天记录
      if(params.type === 'ev:close-records') {
        recordsWindow.webContents.send('main-render-dom', false);
        recordsWindow.hide()
        recordsWindow.webContents.reload()
      } 
      // 关闭通话
      if(params.type === 'ev:close-call') {
        callWindow.webContents.send('main-render-dom', false);
        callWindow.webContents.reload()
        callWindow.hide()
      }
      // 查询好友请求列表
      if (params.type === 'query-friend-relation') {
        return db.queryFriendRelation(params)
      }
      // 插入好友请求列表
      if (params.type === 'insert-friend-requests') {
        return db.batchInsertRequests(params)
      }
      // 查询好友列表
      if (params.type === 'query-friend-requests') {
        return db.queryFriendRequests(params)
      }
      // 插入好友列表
      if (params.type === 'insert-friend-relation') {
        return db.batchInsertFriends(params)
      }
      // 查询聊天房间
      if (params.type === 'query-chat-rooms') {
        return db.queryChatRooms(params)
      }
      if(params.type === 'query-user-login') {
        return db.queryUserIsLogin(params)
      }
      if(params.type === 'update-user-user') {
        return db.updateUserIsLogin(params)
      }
      // 插入聊天房间
      if (params.type === 'insert-chat-rooms') {
        db.batchInsertRooms(params.list, params.userId)
      }
      // 分页查询聊天记录
      if (params.type === 'query-chat-records') {
        return db.queryChatRecords(params)
      }
      // 批量插入聊天记录
      if (params.type === 'insert-chat-recordList') {
        db.batchInsertChatRecords(params.list)
      }
      // 插入聊天记录
      if (params.type === 'insert-chat-record') {
        return db.insertChatRecord(params.list)
      }
      // 查询房间内的聊天记录
      if (params.type === 'query-chat-rooms-records') {
        return db.queryChatRecords(params)
      }
      // 主屏幕最小化
      if (params.type === 'minimize-window:main') {
        mainWindow.minimize()
      }
      // 主屏幕最大化
      if (params.type === 'maximize-window:main') {
        if (mainWindow.isMaximized()) {
          mainWindow.unmaximize()
        } else {
          mainWindow.maximize()
        }
      }
      // 截图
      if(params.type === 'ev:print-scr') {
        exec(path.join(__dirname, '..', '..', 'static', 'PrintScr.exe'))
      }
      // 退出登录
      if (params.type === 'login-out') {
        mainWindow.webContents.reload() // 刷新页面
        mainWindow.webContents.send('main-render-dom', false); // 隐藏DOM
        socketRenderer.close() // 断开Socket
        mainWindow.hide()
        mainWindow.webContents.reload()
        loginWindow.show()
        //dataStorage.clear()
      }
      return 'success'
    })
    mainWindow.on('close', (event) => {
      if(canQuitNow) {
        // 阻止窗口关闭  
        event.preventDefault();  
        mainWindow.webContents.send('main-render-dom', false);
        mainWindow.hide()
      }  
    });
}

// 创建朋友圈窗口
const createOtherWindow = () => {
  otherWindw = new BrowserWindow({
    title: '朋友圈',
    customName: 'Moments',
    width: 550,
    height: 800,
    center: false,
    frame: false,
    show: false,
    movable: true,
    rounded: true, // 圆角
    transparent: false, // 启用透明窗口
    webPreferences: {
      nodeIntegration: true, // 是否启用Node.js集成
      webSecurity: false,
      preload: path.join(__dirname, 'preload.js'),
      //session: customSes, //共享session
      partition: 'persist:share',
    },
  })
  // 使窗口不显示在任务栏上
  // otherWindw.setSkipTaskbar(true);
  otherWindw.customName='Moments'
  otherWindw.setMenu(null)
  // 设置窗口是否可以由用户手动最大化。
  otherWindw.setMaximizable(false)
  // 设置用户是否可以调节窗口尺寸
  otherWindw.setResizable(false)
  if (app.isPackaged) {
    otherWindw.loadFile(`file://${path.join(__dirname, '../../dist/index.html')}`, {hash: '/wechat-moments'})
    // otherWindw.webContents.openDevTools()
  } else {
    otherWindw.loadURL('http://localhost:5173/#/wechat-moments')
    //loginWindow.loadURL('http://127.0.0.1:5173/login.html')
    otherWindw.webContents.openDevTools()
  }
  otherWindw.on('close', (event) => {  
    if(canQuitNow) {
      // 阻止窗口关闭  
      event.preventDefault();  
      otherWindw.webContents.send('main-render-dom', false);
      otherWindw.hide()
    }
  });
  // 监听事件
  ipcMain.handle('sent-moment-event', async (event, params) => {
    // 关闭朋友圈窗口
    if (params.type === 'close:moment') {
      otherWindw.webContents.send('main-render-dom', false);
      otherWindw.webContents.reload()
      otherWindw.hide()
    }
    // 朋友圈最小化
    if (params.type === 'minimize-window:moment') {
      otherWindw.minimize()
    }
    return 'success'
  })
}

// 创建添加朋友窗口
const createFriendsRequestWindow = () => {
  friendsWindow = new BrowserWindow({
    title: '添加好友',
    customName: 'friendsRequest',
    width: 360,
    height: 620,
    center: false,
    frame: false,
    show: false,
    movable: true,
    rounded: true, // 圆角
    transparent: false, // 启用透明窗口
    webPreferences: {
      nodeIntegration: true, // 是否启用Node.js集成
      webSecurity: false,
      preload: path.join(__dirname, 'preload.js'),
      //session: customSes, //共享session
      partition: 'persist:share',
    },
  })
  friendsWindow.customName='Moments'
  friendsWindow.setMenu(null)
  // 设置窗口是否可以由用户手动最大化。
  friendsWindow.setMaximizable(false)
  // 设置用户是否可以调节窗口尺寸
  friendsWindow.setResizable(false)
  // 使窗口不显示在任务栏上
  // friendsWindow.setSkipTaskbar(true);
  if (app.isPackaged) {
    friendsWindow.loadFile(`${path.join(__dirname, '../../dist/index.html')}`, {hash: '/friend-request'})
  } else {
    friendsWindow.loadURL('http://localhost:5173/#/friend-request')
    //friendsWindow.webContents.openDevTools()
  }
  friendsWindow.on('close', (event) => {  
    if(canQuitNow) {
      // 阻止窗口关闭  
      event.preventDefault();  
      friendsWindow.webContents.send('main-render-dom', false);
      friendsWindow.hide()
    }
  });
  // 监听事件
  ipcMain.handle('sent-friends-event', async (event, params) => {
    // 关闭朋友圈窗口
    if (params.type === 'closed') {
      friendsWindow.hide()
      friendsWindow.webContents.reload()
    }
    return 'success'
  })
}

// 创建聊天记录窗口
const createChatRecordsWindow = () => {
  recordsWindow = new BrowserWindow({
    title: '聊天记录',
    width: 570,
    height: 650,
    center: false,
    frame: false,
    show: false,
    rounded: true, // 圆角
    transparent: false, // 启用透明窗口
    movable: true,
    //parent: mainWindow,
    webPreferences: {
      nodeIntegration: true, // 是否启用Node.js集成
      webSecurity: false,
      preload: path.join(__dirname, 'preload.js'),
      //session: customSes, //共享session
      partition: 'persist:share',
    },
  })
  // 使窗口不显示在任务栏上
  // recordsWindow.setSkipTaskbar(true);
  recordsWindow.customName='ChatRecords'
  recordsWindow.setMenu(null)
  // 设置窗口是否可以由用户手动最大化。
  recordsWindow.setMaximizable(false)
  // 设置用户是否可以调节窗口尺寸
  recordsWindow.setResizable(false)
  if (app.isPackaged) {
    recordsWindow.loadFile(`${path.join(__dirname, '../../dist/index.html')}`, {hash: '/chat-records'})
    // recordsWindow.webContents.openDevTools()
  } else {
    recordsWindow.loadURL('http://localhost:5173/#/chat-records')
    //loginWindow.loadURL('http://127.0.0.1:5173/login.html')
    //recordsWindow.webContents.openDevTools()
  }
  recordsWindow.on('close', (event) => {  
    if(canQuitNow) {
      // 阻止窗口关闭  
      event.preventDefault();  
      recordsWindow.webContents.send('main-render-dom', false);
      recordsWindow.hide()
    }

  });
  
  // 监听事件
  ipcMain.handle('sent-record-event', async (event, params) => {
    // 关闭聊天记录
    if(params.type === 'ev:close-records') {
      recordsWindow.webContents.send('main-render-dom', false);
      recordsWindow.hide()
      recordsWindow.webContents.reload()
    } 
    return 'success'
  })
}

// 创建通话窗口
const createCallWindow = () => {
  callWindow = new BrowserWindow({
    title: '在线通话',
    customName: 'OnlineCall',
    width: 365,
    height: 645,
    center: false,
    frame: false,
    show: false,
    rounded: true, // 圆角
    transparent: false, // 启用透明窗口
    movable: true,
    //parent: mainWindow,
    webPreferences: {
      nodeIntegration: true, // 是否启用Node.js集成
      webSecurity: false,
      preload: path.join(__dirname, 'preload.js'),
      //session: customSes, //共享session
      partition: 'persist:share',
    },
  })
  // 使窗口不显示在任务栏上
  // callWindow.setSkipTaskbar(true);
  callWindow.customName='OnlineCall'
  callWindow.setMenu(null)
  // 设置窗口是否可以由用户手动最大化。
  callWindow.setMaximizable(false)
  // 设置用户是否可以调节窗口尺寸
  callWindow.setResizable(false)
  if (app.isPackaged) {
    callWindow.loadFile(`${path.join(__dirname, '../../dist/index.html')}`, {hash: '/voice-page'})
    //callWindow.webContents.openDevTools()
  } else {
    callWindow.loadURL('http://localhost:5173/#/voice-page')
    //loginWindow.loadURL('http://127.0.0.1:5173/login.html')
    //callWindow.webContents.openDevTools()
  }
  callWindow.on('close', (event) => {  
    if(canQuitNow) {
      // 阻止窗口关闭  
      event.preventDefault();  
      callWindow.webContents.send('main-render-dom', false);
      callWindow.hide()
    }
  });
  // 监听事件
  ipcMain.handle('sent-event', async (event, params) => {
    // 打开通话窗口
    if (params.type === 'ev:voice-page') {
      try{
        callWindow.webContents.send('main-render-chat-call', {roomId: params.roomId, roomName: params.roomName, avatar: params.avatar, callType: params.callType});
        callWindow.show()
      }catch(err){
        createCallWindow()
        callWindow.webContents.send('main-render-chat-call', {roomId: params.roomId, roomName: params.roomName, avatar: params.avatar, callType: params.callType});
        callWindow.show()
      }
    } 
    // 关闭通话
    if(params.type === 'ev:close-call') {
      callWindow.webContents.send('main-render-dom', false);
      callWindow.hide()
      callWindow.webContents.reload()
    }
    return 'success'
  })
}

// 设置Pinia状态
ipcMain.handle("pinia-store-event",(event, params) => {
  if(params.type === 'pinia-get-store') {
    return dataStorage.get(params.key)
  }
  if(params.type === 'pinia-set-store') {
    return dataStorage.set(params.key, params.dataStr)
  }
  if(params.type === 'pinia-change-store') {
    // 遍历window执行
    for (const currentWin of BrowserWindow.getAllWindows()) {
      const webContentsId = currentWin.webContents.id;
      if (webContentsId !== event.sender.id && !currentWin.isDestroyed()) {
        currentWin.webContents.send(
          "pinia-store-set",
          params.storeName,
          params.data
        );
      }
    }
  }
});


app.whenReady().then(() => {
  tray = new Tray(path.join(__dirname, './icons/3.png')); // 替换为你的图标路径
  const contextMenu = Menu.buildFromTemplate([
    { label: '首页', click: () => { 
      mainWindow.webContents.send('main-load-records', true);
      mainWindow.show();  // 显示主窗口
    } },
    { label: '退出', click: () => { canQuitNow = true; app.quit(); } }
  ]);

  tray.setToolTip('This is my application. mini Wechat');
  tray.setContextMenu(contextMenu);
  createLoginWindow() // 创建登录窗口
  createMainWindow() // 创建主窗口
  // createChatRecordsWindow()
  //createChatRecordsWindow() // 创建主窗口
  //createCallWindow() // 创建主窗口
  //createScrWindow() // 创建截屏接口

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createLoginWindow()
  })
})

// 在 app.quit() 之后调用 process.exit()
app.on('will-quit', () => {
  console.log('App is quitting...');
  app.quit()
  process.exit();
});

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
    process.exit();
  }
})
